/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package controladores;

import controladores.exceptions.IllegalOrphanException;
import controladores.exceptions.NonexistentEntityException;
import controladores.exceptions.PreexistingEntityException;
import java.io.Serializable;
import javax.persistence.Query;
import javax.persistence.EntityNotFoundException;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.Root;
import modelo.Venta;
import modelo.Producto;
import modelo.Devolucion;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import modelo.Itemventa;
import modelo.ItemventaPK;

/**
 *
 * @author usuario
 */
public class ItemventaJpaController implements Serializable {

    public ItemventaJpaController(EntityManagerFactory emf) {
        this.emf = emf;
    }
    private EntityManagerFactory emf = null;

    public EntityManager getEntityManager() {
        return emf.createEntityManager();
    }

    public void create(Itemventa itemventa) throws PreexistingEntityException, Exception {
        if (itemventa.getItemventaPK() == null) {
            itemventa.setItemventaPK(new ItemventaPK());
        }
        if (itemventa.getDevolucionCollection() == null) {
            itemventa.setDevolucionCollection(new ArrayList<Devolucion>());
        }
        itemventa.getItemventaPK().setIdventa(itemventa.getVenta().getIdventa());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Venta venta = itemventa.getVenta();
            if (venta != null) {
                venta = em.getReference(venta.getClass(), venta.getIdventa());
                itemventa.setVenta(venta);
            }
            Producto idproducto = itemventa.getIdproducto();
            if (idproducto != null) {
                idproducto = em.getReference(idproducto.getClass(), idproducto.getIdproducto());
                itemventa.setIdproducto(idproducto);
            }
            Collection<Devolucion> attachedDevolucionCollection = new ArrayList<Devolucion>();
            for (Devolucion devolucionCollectionDevolucionToAttach : itemventa.getDevolucionCollection()) {
                devolucionCollectionDevolucionToAttach = em.getReference(devolucionCollectionDevolucionToAttach.getClass(), devolucionCollectionDevolucionToAttach.getDevolucionPK());
                attachedDevolucionCollection.add(devolucionCollectionDevolucionToAttach);
            }
            itemventa.setDevolucionCollection(attachedDevolucionCollection);
            em.persist(itemventa);
            if (venta != null) {
                venta.getItemventaCollection().add(itemventa);
                venta = em.merge(venta);
            }
            if (idproducto != null) {
                idproducto.getItemventaCollection().add(itemventa);
                idproducto = em.merge(idproducto);
            }
            for (Devolucion devolucionCollectionDevolucion : itemventa.getDevolucionCollection()) {
                Itemventa oldItemventaOfDevolucionCollectionDevolucion = devolucionCollectionDevolucion.getItemventa();
                devolucionCollectionDevolucion.setItemventa(itemventa);
                devolucionCollectionDevolucion = em.merge(devolucionCollectionDevolucion);
                if (oldItemventaOfDevolucionCollectionDevolucion != null) {
                    oldItemventaOfDevolucionCollectionDevolucion.getDevolucionCollection().remove(devolucionCollectionDevolucion);
                    oldItemventaOfDevolucionCollectionDevolucion = em.merge(oldItemventaOfDevolucionCollectionDevolucion);
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            if (findItemventa(itemventa.getItemventaPK()) != null) {
                throw new PreexistingEntityException("Itemventa " + itemventa + " already exists.", ex);
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void edit(Itemventa itemventa) throws IllegalOrphanException, NonexistentEntityException, Exception {
        itemventa.getItemventaPK().setIdventa(itemventa.getVenta().getIdventa());
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Itemventa persistentItemventa = em.find(Itemventa.class, itemventa.getItemventaPK());
            Venta ventaOld = persistentItemventa.getVenta();
            Venta ventaNew = itemventa.getVenta();
            Producto idproductoOld = persistentItemventa.getIdproducto();
            Producto idproductoNew = itemventa.getIdproducto();
            Collection<Devolucion> devolucionCollectionOld = persistentItemventa.getDevolucionCollection();
            Collection<Devolucion> devolucionCollectionNew = itemventa.getDevolucionCollection();
            List<String> illegalOrphanMessages = null;
            for (Devolucion devolucionCollectionOldDevolucion : devolucionCollectionOld) {
                if (!devolucionCollectionNew.contains(devolucionCollectionOldDevolucion)) {
                    if (illegalOrphanMessages == null) {
                        illegalOrphanMessages = new ArrayList<String>();
                    }
                    illegalOrphanMessages.add("You must retain Devolucion " + devolucionCollectionOldDevolucion + " since its itemventa field is not nullable.");
                }
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            if (ventaNew != null) {
                ventaNew = em.getReference(ventaNew.getClass(), ventaNew.getIdventa());
                itemventa.setVenta(ventaNew);
            }
            if (idproductoNew != null) {
                idproductoNew = em.getReference(idproductoNew.getClass(), idproductoNew.getIdproducto());
                itemventa.setIdproducto(idproductoNew);
            }
            Collection<Devolucion> attachedDevolucionCollectionNew = new ArrayList<Devolucion>();
            for (Devolucion devolucionCollectionNewDevolucionToAttach : devolucionCollectionNew) {
                devolucionCollectionNewDevolucionToAttach = em.getReference(devolucionCollectionNewDevolucionToAttach.getClass(), devolucionCollectionNewDevolucionToAttach.getDevolucionPK());
                attachedDevolucionCollectionNew.add(devolucionCollectionNewDevolucionToAttach);
            }
            devolucionCollectionNew = attachedDevolucionCollectionNew;
            itemventa.setDevolucionCollection(devolucionCollectionNew);
            itemventa = em.merge(itemventa);
            if (ventaOld != null && !ventaOld.equals(ventaNew)) {
                ventaOld.getItemventaCollection().remove(itemventa);
                ventaOld = em.merge(ventaOld);
            }
            if (ventaNew != null && !ventaNew.equals(ventaOld)) {
                ventaNew.getItemventaCollection().add(itemventa);
                ventaNew = em.merge(ventaNew);
            }
            if (idproductoOld != null && !idproductoOld.equals(idproductoNew)) {
                idproductoOld.getItemventaCollection().remove(itemventa);
                idproductoOld = em.merge(idproductoOld);
            }
            if (idproductoNew != null && !idproductoNew.equals(idproductoOld)) {
                idproductoNew.getItemventaCollection().add(itemventa);
                idproductoNew = em.merge(idproductoNew);
            }
            for (Devolucion devolucionCollectionNewDevolucion : devolucionCollectionNew) {
                if (!devolucionCollectionOld.contains(devolucionCollectionNewDevolucion)) {
                    Itemventa oldItemventaOfDevolucionCollectionNewDevolucion = devolucionCollectionNewDevolucion.getItemventa();
                    devolucionCollectionNewDevolucion.setItemventa(itemventa);
                    devolucionCollectionNewDevolucion = em.merge(devolucionCollectionNewDevolucion);
                    if (oldItemventaOfDevolucionCollectionNewDevolucion != null && !oldItemventaOfDevolucionCollectionNewDevolucion.equals(itemventa)) {
                        oldItemventaOfDevolucionCollectionNewDevolucion.getDevolucionCollection().remove(devolucionCollectionNewDevolucion);
                        oldItemventaOfDevolucionCollectionNewDevolucion = em.merge(oldItemventaOfDevolucionCollectionNewDevolucion);
                    }
                }
            }
            em.getTransaction().commit();
        } catch (Exception ex) {
            String msg = ex.getLocalizedMessage();
            if (msg == null || msg.length() == 0) {
                ItemventaPK id = itemventa.getItemventaPK();
                if (findItemventa(id) == null) {
                    throw new NonexistentEntityException("The itemventa with id " + id + " no longer exists.");
                }
            }
            throw ex;
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public void destroy(ItemventaPK id) throws IllegalOrphanException, NonexistentEntityException {
        EntityManager em = null;
        try {
            em = getEntityManager();
            em.getTransaction().begin();
            Itemventa itemventa;
            try {
                itemventa = em.getReference(Itemventa.class, id);
                itemventa.getItemventaPK();
            } catch (EntityNotFoundException enfe) {
                throw new NonexistentEntityException("The itemventa with id " + id + " no longer exists.", enfe);
            }
            List<String> illegalOrphanMessages = null;
            Collection<Devolucion> devolucionCollectionOrphanCheck = itemventa.getDevolucionCollection();
            for (Devolucion devolucionCollectionOrphanCheckDevolucion : devolucionCollectionOrphanCheck) {
                if (illegalOrphanMessages == null) {
                    illegalOrphanMessages = new ArrayList<String>();
                }
                illegalOrphanMessages.add("This Itemventa (" + itemventa + ") cannot be destroyed since the Devolucion " + devolucionCollectionOrphanCheckDevolucion + " in its devolucionCollection field has a non-nullable itemventa field.");
            }
            if (illegalOrphanMessages != null) {
                throw new IllegalOrphanException(illegalOrphanMessages);
            }
            Venta venta = itemventa.getVenta();
            if (venta != null) {
                venta.getItemventaCollection().remove(itemventa);
                venta = em.merge(venta);
            }
            Producto idproducto = itemventa.getIdproducto();
            if (idproducto != null) {
                idproducto.getItemventaCollection().remove(itemventa);
                idproducto = em.merge(idproducto);
            }
            em.remove(itemventa);
            em.getTransaction().commit();
        } finally {
            if (em != null) {
                em.close();
            }
        }
    }

    public List<Itemventa> findItemventaEntities() {
        return findItemventaEntities(true, -1, -1);
    }

    public List<Itemventa> findItemventaEntities(int maxResults, int firstResult) {
        return findItemventaEntities(false, maxResults, firstResult);
    }

    private List<Itemventa> findItemventaEntities(boolean all, int maxResults, int firstResult) {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            cq.select(cq.from(Itemventa.class));
            Query q = em.createQuery(cq);
            if (!all) {
                q.setMaxResults(maxResults);
                q.setFirstResult(firstResult);
            }
            return q.getResultList();
        } finally {
            em.close();
        }
    }

    public Itemventa findItemventa(ItemventaPK id) {
        EntityManager em = getEntityManager();
        try {
            return em.find(Itemventa.class, id);
        } finally {
            em.close();
        }
    }

    public int getItemventaCount() {
        EntityManager em = getEntityManager();
        try {
            CriteriaQuery cq = em.getCriteriaBuilder().createQuery();
            Root<Itemventa> rt = cq.from(Itemventa.class);
            cq.select(em.getCriteriaBuilder().count(rt));
            Query q = em.createQuery(cq);
            return ((Long) q.getSingleResult()).intValue();
        } finally {
            em.close();
        }
    }
    
}
